;#############################
;命令：
;nasm -f elf64 day2_0function_1call_function_with_multiple_parameters_2pro.asm -o main.o && gcc main.o -o main -lc -no-pie && ./main
;输出：
;传入参数为：1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
;传入参数为：1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
;传入参数为：1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
;传入参数为：1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
;#############################
extern printf

section .data
	msg: db `传入参数为：%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n`, 0

section .text
	global main

main:
	push rbp
	mov rbp, rsp

;#######################
	sub rsp, 8
	push 12
	push 11
	push 10
	push 9
	push 8
	push 7
	push 6
	mov r9, 5
	mov r8, 4
	mov rcx, 3
	mov rdx, 2
	mov rsi, 1
	mov rdi, msg
	call printf

	add rsp, 64
;#######################

;################################################
	sub rsp, 24
	push 12
	push 11
	push 10
	push 9
	push 8
	push 7
	push 6
	mov r9, 5
	mov r8, 4
	mov rcx, 3
	mov rdx, 2
	mov rsi, 1
	mov rdi, msg
	call printf

	add rsp, 80
	;stack需对齐到16的整数倍
	;而push只用了7 * 8 = 56
	;对齐16至少需要分配64
	;对齐16也可以80、96、等等
	;对齐的同时也要相应拼凑sub语句
	;add rsp, 80
	;sub rsp, 24
	;应满足80 - 24 = 56，即为push花费的空间
	;前面sub rsp, 24只是为了凑数用的
	;我用这种写法
	;单纯的为了讲
	;有省stack的凑法
	;不省stack的凑法也是符合规则的
;################################################

;#######################
	sub rsp, 40
	push 12
	push 11
	push 10
	push 9
	push 8
	push 7
	push 6
	mov r9, 5
	mov r8, 4
	mov rcx, 3
	mov rdx, 2
	mov rsi, 1
	mov rdi, msg
	call printf

	add rsp, 96
;#######################

;#######################
	sub rsp, 104
	push 12
	push 11
	push 10
	push 9
	push 8
	push 7
	push 6
	mov r9, 5
	mov r8, 4
	mov rcx, 3
	mov rdx, 2
	mov rsi, 1
	mov rdi, msg
	call printf

	add rsp, 160
;#######################

	mov eax, 0
	leave
	ret
